'''
１　接收数据　
２　校验数据　cookies
３  获取redis信息
４　做数据合并前的准备
５　定义两个变量
６　保存数据
７　删除cookies

'''
import base64
import pickle
from django_redis import get_redis_connection


def merge_cart_cookie_to_redis(request, user, response):
    # １　接收数据　
    cart = request.COOKIES.get('cart')
    # ２　校验数据　cookies
    if cart is not None:
        cookies_cart = pickle.loads(base64.b64decode(cart))
    # ３  获取redis信息
    redis_conn = get_redis_connection('cart')
    # 从数据库中取到所有的数据
    redis_cart = redis_conn.hgetall('cart_%s'%user.id)
    # ４　定义一个空字典　用于将从redis 中的byte类型数据转换一下
    cart = {}
    for sku_id,count in redis_cart.items():
        # 将byte类型转换成　int
        cart[int(sku_id)] = int(count)
    # ５ 定义一个列表用于存放cook中的selected
    selected_count_id_list = []
    # 遍历cook键值对 { sku_id:{'count':count,'selected':selected}
    for sku_id,selected_count_id_dict in cookies_cart.items():
        # 如果在redis中cart中有这个商品　那么就修改数量　以cook的数量为主　没有这个商品就新建
        cart[sku_id]=selected_count_id_dict['count']
        # 如果这个状态为true
        if selected_count_id_dict['selected']:
            # 就将这个商品的sku_id 加入到这个列表中
            selected_count_id_list.append(sku_id)
            # 进行数据库指令的优化
            pl = redis_conn.pipeline()
            # 将生成的字典从新放到哈希表中
            pl.hset('cart_%s'%user.id,cart)
            # 将生成的selected 放到内
            pl.sadd('cart_%s'%user.id,*selected_count_id_list)
            # 删除cookies
            response.delete_cookie('cart')

            return response
        else:
            return response